#include <bits/stdc++.h>
// 2025/06/10
// tag:
// Author: Forever
using namespace std;
using int64 = int64_t;
const int N = 3001;

struct node {
    int first, second;
    node(int _first, int _second)
    {
        first = _first;
        second = _second;
    }
};

int n, m, cost[N], f[N][N];
vector<node> edge[N];

int dfs(int u)
{
    f[u][0] = 0; // 初始化：不保留任何用户时收益为0

    // 叶子节点处理（用户终端）
    if (u > n - m) {
        f[u][1] = cost[u]; // 保留自身用户的收益
        return 1; // 返回可保留用户数（自身1个）
    }

    int s = 0; // 累计当前节点可保留的最大用户数

    // 遍历所有子节点（树形DP结构）
    for (auto v : edge[u]) {
        s += dfs(v.first); // 递归处理子树，累加可用用户数

        // 背包DP核心（倒序更新防止状态覆盖）
        for (int i = s; i >= 1; i--) {
            // j表示分配给当前子节点的用户数（0<=j<=i）
            for (int j = 0; j <= i; j++) {
                // 状态转移：保留i-j个用户给其他子树 + j个用户给当前子树 - 线路成本
                f[u][i] = max(f[u][i], f[u][i - j] + f[v.first][j] - v.second);
            }
        }
    }
    return s; // 返回当前子树可提供的最大用户数
}

signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    memset(f, -0x3f, sizeof(f));
    cin >> n >> m;
    for (int i = 1; i <= n - m; i++) {
        int k, a, b;
        cin >> k;
        for (int j = 1; j <= k; j++) {
            cin >> a >> b;
            edge[i].push_back({ a, b });
        }
    }
    for (int i = n - m + 1; i <= n; i++)
        cin >> cost[i];
    dfs(1);
    for (int i = m; i >= 0; i--) {
        if (f[1][i] >= 0) {
            cout << i << endl;
            break;
        }
    }
    return 0;
}